//! https://leetcode-cn.com/problems/word-pattern/
//! 290. 单词规律
//! 给定一种规律 pattern 和一个字符串 str ，判断 str 是否遵循相同的规律。
//! 这里的 遵循 指完全匹配，
//! 例如， pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

pub struct Solution {}

#[allow(dead_code)]
impl Solution {
    pub fn word_pattern(pattern: String, s: String) -> bool {
        use std::collections::HashMap;
        let mut hash_map: HashMap<String, String> = HashMap::new();
        let mut hash_map2: HashMap<String, String> = HashMap::new();
        let b: Vec<&str> = s.split(" ").collect();
        let a: Vec<&str> = pattern.split("").filter(|x| x.len() > 0).collect();

        if a.len() != b.len() {
            return false;
        }

        for i in 0..(a.len()) {
            if let Some(val) = hash_map.get(a[i]) {
                if val != b[i] {
                    return false;
                }
            } else {
                hash_map.insert(a[i].to_string(), b[i].to_string());
            }

            if let Some(val) = hash_map2.get(b[i]) {
                if val != a[i] {
                    return false;
                }
            } else {
                hash_map2.insert(b[i].to_string(), a[i].to_string());
            }
        }
        true
    }
}

#[cfg(test)]
mod test {
    #[test]
    fn test() {
        assert_eq!(
            super::Solution::word_pattern("abba".to_string(), "dog cat cat dog".to_string()),
            true
        );
        assert_eq!(
            super::Solution::word_pattern("abba".to_string(), "dog cat cat fish".to_string()),
            false
        );
        assert_eq!(
            super::Solution::word_pattern("aaaa".to_string(), "dog cat cat dog".to_string()),
            false
        );
    }
}
